import os
import json
from flask import Blueprint, render_template, request, jsonify
from my_const import EVALUATION_RESULT_DIR

from util.log_util import get_the_logger
logger = get_the_logger(__name__)

evaluation_bp = Blueprint('evaluation', __name__)

@evaluation_bp.route('/evaluation')
def evaluation_page():
    """评估结果展示页面"""
    return render_template('evaluation.html')

@evaluation_bp.route('/api/evaluation')
def api_evaluation():
    """获取指定天数的评估结果API，支持?days=30参数"""
    # 1. 获取策略参数
    valid_strategies = ['dca', 'ma', 'drop']
    strategy = request.args.get('strategy', None)
    if strategy and strategy.lower() not in valid_strategies:
        return jsonify({"error": "无效的策略类型"}), 400

    # 2. 获取MA范围参数（仅对MA策略有效）
    ma_range = request.args.get('ma_range', None)
    if strategy == 'ma' and ma_range:
        try:
            ma_range = int(ma_range)
            if ma_range not in [30, 60, 90]:
                return jsonify({"error": f"不支持的MA范围 {ma_range}，可选值：30,60,90"}), 400
        except ValueError:
            return jsonify({"error": "MA范围参数必须是整数"}), 400

    # 3. 构造目标文件名格式
    if strategy == 'ma' and ma_range:
        target_suffix = f"_{strategy}_{ma_range}d.json"
    else:
        target_suffix = f"_{strategy}.json"

    # 4. 查找所有符合条件的结果文件
    try:
        # 列出评估结果目录中所有以'result_'开头的文件
        result_files = [
            f for f in os.listdir(EVALUATION_RESULT_DIR)
            if f.startswith('result_') and f.endswith(target_suffix)
        ]
    except FileNotFoundError:
        return jsonify({"error": "评估结果目录不存在"}), 500
    except PermissionError:
        return jsonify({"error": "无权限访问评估结果目录"}), 500

    # 5. 处理无结果的情况
    if not result_files:
        return jsonify({"error": f"未找到评估结果文件 {target_suffix}"}), 500

    # 5. 按日期排序，取最新的文件（文件名格式：result_YYYYMMDD_daysd.json）
    # 排序依据：文件名中的日期部分（如result_20250717_30d.json中的20250717）
    result_files.sort(reverse=True, key=lambda x: x.split('_')[1])  # 按日期降序
    latest_file = result_files[0]
    file_path = os.path.join(EVALUATION_RESULT_DIR, latest_file)

    # 6. 读取并返回结果
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            results = json.load(f)

        # 提取日期（如20250717 -> 2025-07-17）
        date_str = latest_file.split('_')[1]
        formatted_date = f"{date_str[:4]}-{date_str[4:6]}-{date_str[6:]}"

        return jsonify({
            "evaluation_date": formatted_date,  # 格式化后的日期
            "results": results
        })
    except json.JSONDecodeError:
        return jsonify({"error": f"评估结果文件{latest_file}格式错误"}), 500
    except Exception as e:
        return jsonify({"error": f"读取结果失败：{str(e)}"}), 500

@evaluation_bp.route('/api/trigger-evaluation', methods=['POST'])
def trigger_evaluation():
    """手动触发基金评估任务"""
    try:
        # 直接调用评估函数（与定时任务执行相同逻辑）
        from scheduler import job_get_fund_history_data
        job_get_fund_history_data()
        return jsonify({
            "success": True,
            "message": "评估任务已启动"
        })
    except Exception as e:
        # 捕获并返回错误信息
        return jsonify({
            "success": False,
            "error": f"评估任务执行失败：{str(e)}"
        }), 500